#include "businessFunc.h"
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include "commonTool.h"
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <json-c/json.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <error.h>
#include <stdbool.h>
#include <termios.h>




//system("stty sane");/* 打开缓冲区，输出字符需要按回车键 */

enum DIRECTION_OPTION
{
    UP = 'W',
    DOWN = 'S',
    ENTER = 'D', /* 确认选择 */
};

enum USER_INFO_OPTION
{
    NAME,             /* 用户名 */
    PASSWD,           /* 密码 */ 
    UPPER_LAYER,      /* 退出 */
};


/* 通信句柄 */
extern int g_connfd;


/* 静态函数前置声明 */

static int showRegisterMenuInfo(int whichOption, UserInfo * info);
static int chatRoomInputRegisterInfo(int whichOption, UserInfo * info);


/* 客户端封装信息给服务器 (注册/登陆) */
static const char * packageUserInfoJsonStr(FUNCTION_OPTION businessType, UserInfo * info);



/* 
    @brief:     界面菜单
    @argument1: 高亮
    @return:    成功返回0, 失败返回错误码
*/
int chatRoomUiMenu(int optionLight)
{
    
    printf("\033[%d;31;47m               注册               \033[0m\n", optionLight == REGIS ? 1 : 0);
    printf("\033[%d;31;47m               登陆               \033[0m\n", optionLight == LOGIN ? 1 : 0);
    printf("\033[%d;31;47m               退出               \033[0m\n", optionLight == EXITS ? 1 : 0);
   

    return 0;
}

int chatRoomUiMenu11(int optionLight)
{
    /* 关闭缓存区， 输入字符无需按回车键 */
    system("stty -icanon");

    char choice = 0;
    while (1)
    {
        chatRoomUiMenu(optionLight);
        choice = getchar();

        /* 统一格式化大写 */
        choice = toupper(choice);

        switch (choice)
        {
            case UP:
                optionLight = (optionLight + 2) % 3;
                //optionLight = (optionLight == REGIS) ? EXITS : optionLight - 1;
                break;
            case DOWN:
                optionLight = (optionLight + 1) % 3;
                //optionLight = (optionLight == EXITS) ? REGIS : optionLight + 1;
                break;
            case ENTER:
                enterAppointUi(optionLight);
                break;
            default:
                printf("\033[0;31;47m 输错了，重新输入...      \033[0m\n");
                break;
        }
        system("clear");
        usleep(1000);
    }
    // 恢复缓冲区
    system("stty icanon");
    return 0;
}


/* 
    @brief:     进入指定页面
    @argument1: 选项
    @return:    成功返回0, 失败返回错误码
*/
int enterAppointUi(int funcOption)
{
    switch (funcOption)
    {
    case REGIS:
        printf("进入注册界面\n");
        chatRoomClientRegister(); // 调用注册功能
        break;
    case LOGIN:
        printf("进入登录界面\n");
        chatRoomClientLogin();   // 调用登录功能
        break;
    case EXITS:
        printf("退出程序\n");
        exit(0); // 退出程序
        break;
    default:
        printf("无效的选项\n");
        break;
    }
    return 0;

}

/* 
    @brief:     注册页面显示信息
    @argument1: 选项
    @argument2: 用户信息
    @return:    成功返回0, 失败返回错误码
*/
static int showRegisterMenuInfo(int whichOption, UserInfo * info)
{
    printf("\033[%d;31;47m               用户:%-16s               \033[0m\n", whichOption == NAME ? 1 : 0, info->username);
    printf("\033[%d;31;47m               密码:%-16s               \033[0m\n", whichOption == PASSWD ? 1 : 0, info->passwd);
    printf("\033[%d;31;47m               退出:                    \033[0m\n", whichOption == UPPER_LAYER ? 1 : 0);
    return 0;
}



/* 
    @brief:     输入用户注册信息
    @argument1: 选项
    @argument2: 用户信息
    @return:    成功返回0, 失败返回错误码
*/
static int chatRoomInputRegisterInfo(int whichOption, UserInfo * info)
{
    switch(whichOption)
    {
    case NAME:
        do 
        {
            printf("\033[0;31;47m 请输入联系人用户名：           \033[0m\n");
            scanf("%s", info->username);
        } while (checkUserNameLegal(info->username)); /* 校验用户名合法性 */
        break;
    case PASSWD:
        do 
        {
            printf("\033[0;31;47m 请输入联系人密码：             \033[0m\n");
            scanf("%s", info->passwd);
        } while(checkPasswdLegal(info->passwd));     /* 校验密码合法性 */
        break;
    case UPPER_LAYER:
        /* 返回上一级 */
        printf("退出注册\n");
        exit(0);  // 退出程序
        break;
    default:
        printf("addContactEnterAppiont: invaild option");
        break;
    }

    /* 封装成json. */
    packageUserInfoJsonStr(REGIS, info);

    /* 发送信息到服务器 */
    write(g_connfd, info, sizeof(UserInfo));
}

/* 
    @brief:     注册功能
    @return:    成功返回0, 失败返回错误码
*/
int chatRoomClientRegister()
{
    /* 清屏操作 */
    system("clear");
    usleep(3000);
    
    UserInfo info;
    memset(&info, 0, sizeof(info));

    /* 默认让第一栏 高亮 */
    int defaultOption = 0;
    

    char choice = '0';
    while (1)
    {
        showRegisterMenuInfo(defaultOption, &info);
        choice = getchar(); // 获取用户输入

        /* 统一格式化成大写 */
        choice = toupper(choice);
        switch (choice)
        {
        case UP:
            defaultOption = defaultOption == 0 ? 2 :(defaultOption - 1) % 3;
            break;
        case DOWN:
            defaultOption = (defaultOption + 1) % 3;
            break;
        case ENTER:
            chatRoomInputRegisterInfo(defaultOption, &info);
            /* 封装成json字符串 */
            const char *jsonStr = packageUserInfoJsonStr(REGIS, &info);
            /* 发送信息到服务器 */
            write(g_connfd, jsonStr, strlen(jsonStr));
            break;
        default:
            break;
        }

        /* 清屏 */
        system("clear");
    }
   
    system("stty -icanon");//关闭缓冲区，输出字符无需按回车键

    return 0;
}



/* 解析具体的业务功能 */
enum FUNCTION_OPTION parseBusinessOption(const char * str, enum FUNCTION_OPTION *choice)
{
    /* 将json字符串转成json对象 */
    struct json_object * obj = json_tokener_parse(str);
    if (obj == NULL)
    {
        return NULL_PTR;
    }
    
    if (choice)
    {
        *choice = (FUNCTION_OPTION)json_object_get_int(json_object_object_get(obj, "type"));    
    }
    return ON_SUCCESS;
}


/* 
    @brief:     客户端封装信息给服务器 (注册/登陆)
    @argument1: 功能选项
    @argument2: 用户信息
    @return:    成功返回json字符串, 失败返回NULL
*/
static const char * packageUserInfoJsonStr(FUNCTION_OPTION businessType, UserInfo * info)
{
    /* step1: 创建json对象 */
    struct json_object * object = json_object_new_object();
    if (object == NULL)
    {
        perror("json_object_new_object error");
        exit(-1);
    }

    /* 在json对象中添加<key, value> */
    json_object_object_add(object, "type", json_object_new_int(businessType));
    json_object_object_add(object, "username", json_object_new_string(info->username));
    json_object_object_add(object, "passwd", json_object_new_string(info->passwd));


    /* 将json对象转化成字符串 */
    const char * str = json_object_to_json_string(object);
    if (str == NULL)
    {
        perror("json to string error");
        return NULL;
    }

    return str;
}

/*
    @brief          客户端接收服务器注册回复信息
    @param str JSON 字符串表示的回复信息
    @param code     存储回复代码的指针
    @return int     成功返回0，失败返回-1
 */
int chatRoomRecvServerRegisterInfo(const char *str, REGIS_CODE *code)
{
    /* 将 JSON 字符串转成 JSON 对象 */
    struct json_object *obj = json_tokener_parse(str);
    if (obj == NULL)
    {
        return -1; // 返回错误代码
    }

    // 解析注册回复信息
    if (code)
    {
        *code = (REGIS_CODE)json_object_get_int(json_object_object_get(obj, "status_code"));
    }

    return 0;
}


/* 登陆业务 */
int chatRoomClientLogin()
{
    system("clear");
    usleep(3000);

    UserInfo info;
    memset(&info, 0, sizeof(info));

    /* 封装成json字符串 */
    printf("\033[0;31;47m 请输入联系人用户名:           \033[0m\n");
    scanf("%s", info.username);
    printf("\033[0;31;47m 请输入联系人密码 :            \033[0m\n");
    scanf("%s", info.passwd);
        
    /* 封装成json字符串 */
    const char *jsonStr = packageUserInfoJsonStr(LOGIN, &info);
    if (jsonStr == NULL)
    {
        printf("Failed to package user info into JSON string.\n");
        return -1;
    }

    /* 发送信息到服务器 */
    /* 检查是否登陆成功 */
    if (write(g_connfd, jsonStr, strlen(jsonStr)) == -1)
    {
        perror("Error sending login request to server");
        return -1;
    }

    /* 清理json对象 */
    free((void *)jsonStr);
    return 0;
}

/* 客户端接收服务器登陆回复信息 */
int chatRoomRecvServerLoginInfo(const char * str, LOGIN_CODE *code)
{
    /* 将json字符串转成json对象 */
    struct json_object * obj = json_tokener_parse(str);
    if (obj == NULL)
    {
        return NULL_PTR;
    }

    if (code)
    {
        *code = (LOGIN_CODE)json_object_get_int(json_object_object_get(obj, "status_code"));    
    }
    return ON_SUCCESS;
}

/*
    @brief           ： 发送私聊消息给服务
    @return int      ： 成功返回0，失败返回-1
 */
int chatRoomClientPriChat()
{
    char recipient[MAX_USERNAME_LENGTH];
    char message[MAX_MESSAGE_LENGTH];

    printf("请输入私聊对象的用户名：\n");
    /* 从标准输入读取私聊对象的用户名 */
    scanf("%s", recipient); 

    printf("请输入要发送的私聊消息：\n");
    /* 清除输入缓冲区的换行符 */
    getchar();
    /* 从标准输入读取用户输入的私聊消息 */
    fgets(message, MAX_MESSAGE_LENGTH, stdin); 

    /* 去除消息末尾的换行符 */
    message[strcspn(message, "\n")] = '\0';


    return 0;
}

/* 客户端接收服务器私聊回复信息 */
int chatRoomRecvServerPriChatInfo(const char * str, PRICHAT_CODE *code)
{
    /* 将json字符串转成json对象 */
    struct json_object * obj = json_tokener_parse(str);
    if (obj == NULL)
    {
        return NULL_PTR;
    }

    if (code)
    {
        *code = (PRICHAT_CODE)json_object_get_int(json_object_object_get(obj, "status_code"));    
    }
    return ON_SUCCESS;
}

/* 群聊业务 */
int chatRoomClientSharedChat()
{
    char message[MAX_MESSAGE_LENGTH];

    printf("请输入要发送的群聊消息：\n");
    /* 从标准输入读取用户输入的消息 */
    fgets(message, MAX_MESSAGE_LENGTH, stdin);

    // 封装消息成 JSON 格式
    

    // 发送消息到服务器
    

    // 清理 JSON 对象



    return 0;
}

/* 客户端接收服务器群聊回复信息 */
int chatRoomRecvServerSharedChatInfo(const char * str, GROUPCHAT_CODE *code)
{
    /* 将json字符串转成json对象 */
    struct json_object * obj = json_tokener_parse(str);
    if (obj == NULL)
    {
        return NULL_PTR;
    }

    if (code)
    {
        *code = (GROUPCHAT_CODE)json_object_get_int(json_object_object_get(obj, "status_code"));    
    }
    return ON_SUCCESS;
}

/* 客户端接收服务器心跳回复信息 */
int chatRoomRecvServerHeartBeatInfo(const char * str)
{
    // write(g_connfd, "frefer", fregfe);
    return 0;
}



/* 客户端接收服务器 好友上线信息 */
int chatRoomRecvServerFriendOnlineInfo(const char * str)
{


    return 0;
}

/* 添加好友 */
int chatRoomClientAddFriend()
{

    return 0;
}

/* 客户端接收服务器添加好友回复信息 */
int chatRoomRecvServerAddFriendInfo(const char * str)
{    

    return 0;
}
/* 删除好友 */
int chatRoomClientDelFriend()
{
    return 0;
}

/* 客户端接收服务器删除好友回复信息 */
int chatRoomRecvServerdelFriendInfo(const char * str)
{

    return 0;
}

/* 刷新页面 */
int refreshFuncMenu()
{
    /* 清除控制台上的内容 */ 
    system("clear");
    
    /* 等待一段时间，以便用户看清页面清空的效果 */ 
    sleep(1);


    return 0;
}